Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

627
Visualizações
Errores de "definición múltiple", "definido por primera vez aquí"

Tengo 3 proyectos: Servidor , Cliente y Commons . Hacer pares de encabezado y fuente en Commons no causa ningún problema y puedo acceder a las funciones libremente tanto desde el Servidor como desde el Cliente .

Sin embargo, por alguna razón, crear archivos de origen/encabezado adicionales dentro del proyecto del servidor o del cliente siempre provoca errores multiple definition of (...) y first defined here .

Ejemplo:

commands.h (en el directorio raíz del proyecto del Cliente )

 #ifndef COMMANDS_H_ #define COMMANDS_H_ #include "commands.c" void f123(); #endif /* COMMANDS_H_ */

commands.c (en el directorio raíz del proyecto del Cliente )

 void f123(){ }

main.c (en el directorio raíz del proyecto del Cliente )

 #include "commands.h" int main(int argc, char** argv){ }

Errores:

 make: *** [Client] Error 1 Client first defined here Client multiple definition of `f123' commands.c

Limpiar, reconstruir índice, reconstruir proyectos no ayuda. Tampoco reiniciar la computadora.

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

El problema aquí es que está incluyendo commands.c en commands.h antes del prototipo de función. Por lo tanto, el preprocesador de C inserta el contenido de commands.c en commands.h antes del prototipo de función. commands.c contiene la definición de la función. Como resultado, la definición de la función termina antes que la declaración de la función que causa el error.

El contenido de commands.h después de la fase de preprocesador se ve así:

 #ifndef COMMANDS_H_ #define COMMANDS_H_ // function definition void f123(){ } // function declaration void f123(); #endif /* COMMANDS_H_ */

Esto es un error porque no puede declarar una función después de su definición en C. Si cambió #include "commands.c" y la declaración de la función, el error no debería ocurrir porque, ahora, el prototipo de la función viene antes que la declaración de la función. .

Sin embargo, incluir un archivo .c es una mala práctica y debe evitarse. Una mejor solución para este problema sería incluir commands.h en commands.c y vincular la versión compilada de command al archivo principal. Por ejemplo:

comandos.h

 #ifndef COMMANDS_H_ #define COMMANDS_H_ void f123(); // function declaration #endif

comandos.c

 #include "commands.h" void f123(){} // function definition
over 4 years ago · Santiago Trujillo Relatório

0

Tuve un problema similar cuando no usaba inline para mi función global que estaba incluida en dos lugares.

over 4 years ago · Santiago Trujillo Relatório

0

No debe incluir commands.c en su archivo de encabezado. En general, no debe incluir archivos .c. Más bien, commands.c debería incluir commands.h. Como se define aquí, el preprocesador de C está insertando el contenido de commands.c en commands.h donde está el include. Terminas con dos definiciones de f123 en commands.h.

comandos.h

 #ifndef COMMANDS_H_ #define COMMANDS_H_ void f123(); #endif

comandos.c

 #include "commands.h" void f123() { /* code */ }
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda